package 力扣.中等;

import java.util.Arrays;
/*
* 在一个仓库里，有一排条形码，其中第 i 个条形码为 barcodes[i]。

请你重新排列这些条形码，使其中两个相邻的条形码 不能 相等。 你可以返回任何满足该要求的答案，此题保证存在答案。

 

示例 1：

输入：[1,1,1,2,2,2]
输出：[2,1,2,1,2,1]
示例 2：

输入：[1,1,1,1,2,2,3,3]
输出：[1,3,1,3,2,1,2,1]
 思路：双指针 第一个指针指向中间 第二个指针指向末尾 然后都往前走
* 并且只能这么做：如果第一个因为如果第一个指针指向第一个数 第一个数又不能在这个位置 就会失败
*               主要是解决 中间前后的数都相同 则第一个数必须是中间的一个数字
* 有个技巧就是  int mid = (nums.length + 1) / 2; 如果是偶数 mid不变 如果是奇数就+1
* 这样排到最后的时候 剩下的一定是第一个数
*
*   result[i] = nums[odd];
            if (i + 1 < nums.length) {
                result[i + 1] = nums[event];
            }
这个更巧妙 用if把result[i + 1] = nums[event];
* 保证如果是奇数 result会留一个空
*  在进入循环的时候会由 result[i] = nums[odd];来进行插入 并且只插入一个数这样就不会越界了
* 此题用了三个指针 分别是i odd  event
* i的用来给新数组进行插入  odd 是对旧数组中间   event是对旧数组最后
* 此题的进阶是摆动排序
*/
public class 条形码之交叉排序 {
    public static void main(String[] args) {
        int[] nums={1,2,2,2,5};
        int[] result = new int[nums.length];

        //这个+1是和下面 result[i] = nums[odd];对应的
        //万一不可以同时插两个元素 保证第一个元素一定可以插入
       // 只可以从中间往前插 因为如果出现1，2，2，2，5的情况下 1在排头是永远无法插入成功的
        int mid = (nums.length + 1) / 2;
        for (int i = 0, odd = mid - 1, event = nums.length - 1 ; i < nums.length; i += 2, odd--, event--) {
            result[i] = nums[odd];
            if (i + 1 < nums.length) {
                result[i + 1] = nums[event];
            }
        }
        System.out.println(Arrays.toString(result));

        //这个if语句是为了防止中间两个数字相同
        //就把中间这个数和它后面的数字交换位置
        if ( result[mid] ==  result[mid - 1] && mid + 1 < nums.length) {
            int tmp = result[mid];
            result[mid] = result[mid + 1];
            result[mid + 1] = tmp;
        }

        System.out.println(Arrays.toString(result));

    }
}
